package com.alibaba.cola.statemachine.impl;

import com.alibaba.cola.statemachine.State;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * StateHelper
 *
 * @author Frank Zhang
 * @date 2020-02-08 4:23 PM
 */
public class StateHelper {
    /**
     * 在状态对象MAP中，根据状态id获取对应的状态对象
     *
     * @param stateMap 状态对象MAP
     * @param stateId  状态id
     * @param <S>      原状态
     * @param <E>      事件
     * @param <C>      上下文
     * @return 状态对象
     */
    public static <S, E, C> State<S, E, C> getState(Map<S, State<S, E, C>> stateMap, S stateId) {
        return stateMap.computeIfAbsent(stateId, k -> new StateImpl<>(stateId));
    }

    /**
     * 根据状态id列表，获取状态对象列表
     *
     * @param stateMap 状态对象MAP
     * @param stateIds 状态id列表
     * @param <S>      原状态
     * @param <E>      事件
     * @param <C>      上下文
     * @return 状态对象列表
     */
    @SafeVarargs
    public static <S, E, C> List<State<S, E, C>> getStates(Map<S, State<S, E, C>> stateMap, S... stateIds) {
        List<State<S, E, C>> result = new ArrayList<>();
        for (S stateId : stateIds) {
            result.add(getState(stateMap, stateId));
        }
        return result;
    }
}
